import axios from 'axios'
import _time from '../utils/_time'
import _md5 from '../utils/_md5'
import _base64 from '../utils/_base64'
import _object from "../utils/_object";
import _config from "../common/_config";
import cache_openid from "../cache/cache_openid";
import cache_token from "../cache/cache_token";

//明钥
let __KEY = "COMMON@KEY.API";

let __timeout = 10 * 1000;
//允许最大数据长度
let __max_content_length = 4*1024*1024;

//type
let __method = {
  _get : 'GET',
  _post : 'POST',
  _put : 'PUT',
  _del : 'DELETE',
};

//content-type
let __content_type = {
  _primary : 'application/x-www-form-urlencoded',
  _file : 'multipart/form-data',//false
  _json : 'application/json;charset=utf-8',
  _xml : 'text/xml',
};

//data-type
let __data_type = {
  _json : 'json',
  _xml : 'XML',
};

//JSON序列化并加密
let __encode = function (params) {
  return _base64._encode(JSON.stringify(params));
};

//解密并JSON反序列化
let __decode = function (response) {
  return JSON.parse(_base64._decode(response));
};

//默认错误函数回调
let __error = function(e) {
  console.log(e)
};

//ajax私有函数
let __ajax = function(url, method, params, data_ype, timeout, request_before, response_after, headers, serialize, success, error){

  let options = {};
  //将用于请求的服务器URL
  options.url = url;
  //发出请求时使用的请求方式
  options.method = method;
  //作为请求主体发送的数据
  //仅适用于请求方法“PUT”，“POST”和“PATCH”
  if(method === __method._post) {
    options.data = params;
  } else if(method === __method._get){
    options.params = params;
  }
  //用于GET，请求一起发送的URL参数
  //必须是纯对象或URLSearchParams对象
  // options.params = params;
  //将被添加到url前面，除非url是绝对的。
  options.baseURL = _config.domain + '/sale';
  //在请求数据发送到服务器之前对其进行更改
  //只适用于请求方法'PUT'，'POST'和'PATCH'
  if (typeof request_before === "function")
    options.transformRequest = [request_before];
  //允许在 then / catch之前对响应数据进行更改
  if (typeof response_after === "function")
    options.transformResponse = [response_after];
  //自定义header
  options.headers = headers;
  //可选的函数，负责序列化params
  if (typeof serialize === "function")
    options.paramsSerializer = serialize;
  //指定请求超时之前的毫秒数。
  //如果请求的时间超过，请求将被中止。
  options.timeout = timeout;
  //是否跨站点访问控制请求
  options.withCredentials = true; // default false
  //允许自定义处理请求，这使得测试更容易。
  //返回一个promise并提供一个有效的响应
  // options.adapter = function (config) {};
  //表示应该使用 HTTP 基本认证，并提供凭据。
  //这将设置一个`Authorization'头，覆盖任何现有的`Authorization'自定义头，使用`headers`设置。
  // options.auth = {};
  //表示服务器将响应的数据类型
  //包括 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
  options.responseType = data_ype; // default
  //要用作 xsrf 令牌的值的cookie的名称
  // options.xsrfCookieName = 'XSRF-TOKEN'; // default
  //携带xsrf令牌值的http头的名称
  // options.xsrfHeaderName = 'X-XSRF-TOKEN'; // default
  //允许处理上传的进度事件
  // options.onUploadProgress = function (progressEvent) {};
  //允许处理下载的进度事件
  // options.onDownloadProgress = function (progressEvent) {};
  //定义允许的http响应内容的最大大小
  options.maxContentLength = __max_content_length;
  //定义是否解析或拒绝给定的promise
  //HTTP响应状态码。如果`validateStatus`返回`true`（或被设置为`null` promise将被解析;否则，promise将被拒绝。
  // options.validateStatus = function (status) {
  //   return status >= 200 && status < 300; // default
  // };
  //定义在node.js中要遵循的重定向的最大数量。
  //如果设置为0，则不会遵循重定向。
  options.maxRedirects = 5; // 默认
  //用于定义在node.js中分别执行http和https请求时使用的自定义代理。
  // 允许配置类似`keepAlive`的选项，
  // 默认情况下不启用。
  // options.httpAgent = new http.Agent({ keepAlive: true });
  // options.httpsAgent = new https.Agent({ keepAlive: true });
  //定义代理服务器的主机名和端口
  // options.proxy = {};
  //指定可用于取消请求的取消令牌
  // options.cancelToken = new CancelToken(function (cancel) { });
  //执行
  axios(options).then(function (response) {

    if (response.data) {
      success(response.data);
    }

  }).catch(function (e) {
    error(e)
  });
};



//定义类
let _request = {

  //成功标记
  success : 0,
  //失败标记
  fail : -1,

  //初始化参数头
  _params : function (data = null) {
    let time = _time._current();//当前时间戳
    let sign = _md5._hex_md5(time + __KEY);//md5加密工具

    let params = {};
    params.time = time;
    params.sign = sign;
    params.data = _object._length(data) > 0 ? data : {};
    params.wid = 7; // 7
    params.openid = cache_openid.empty() ? '' : cache_openid.get()
    return params;
  },

  // get请求 -- 项目信息，车型库等
  _get : function (url, data, success, error = null) {
    //参数
    const params = this._params(data)

    //默认错误回调
    error = (error == null) ? __error : error

    let header = {};
    header['authorization-token'] = cache_token.empty() ? '' : cache_token.get();

    __ajax(url, __method._get, { t : __encode(params) }, __data_type._json, __timeout, null, __decode,
        header, null, success, error);
  },

  //post请求 -- 提交
  _post : function (url, data, success, error = null) {
    //参数
    const params = this._params(data)

    //默认错误回调
    error = (error == null) ? __error : error;

    let header = {};
    // header['Content-Type'] = __content_type._json;
    header['authorization-token'] = cache_token.empty() ? '' : cache_token.get();

    __ajax(url, __method._post, params, __data_type._json, __timeout, __encode, __decode,
        header, null, success, error);
  },
};

//导出
export default _request;
